package com.sz.jinzheng.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sz.jinzheng.controller.GenerateBill;
import com.sz.jinzheng.mapper.*;
import com.sz.jinzheng.model.*;
import com.sz.jinzheng.service.DistributionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @author qin
 * @version 1.0
 * @description: TODO
 * @date 2021/7/22 22:30
 */
@Slf4j
@Service
public class DistributionServiceImpl implements DistributionService {
    @Autowired
    private TaskMapper taskMapper;
    @Autowired
    private StaffExminationMapper staffExminationMapper;
    @Autowired
    private BorrowerInfoMapper borrowerInfoMapper;
    @Autowired
    private BorrowInfoMapper borrowInfoMapper;
    @Autowired
    private TbillFormMapper tbillFormMapper;

    //查询所有业务经理已审批通过的客户贷款信息
    @Override
    public PageBean<Task> getAllTask(Task task, int index, int size) {
        //利用mybatis分页插件来进行分页数据库
        PageHelper.startPage(index, size);
        List<Task> allTask = taskMapper.getAllTask();
        Page<Task> page = (Page<Task>) allTask;
        PageBean<Task> taskPageBean = new PageBean<>(page.getTotal(),
                page.getPageSize(), page.getPageNum(), page.getPages(), page.getResult());
        return taskPageBean;
    }

    //领取任务，修改任务表中的状态信息
    @Override
    public int updateTaskStatus(Task task) {
        //更新任务表中的status为9，表示发放专员已领取
        int i = taskMapper.updateTaskStatus(task);
        int i2 = 0;
        if (i>0){
            //在t_staff_exmination中添加发放记录，需要工作人员id和任务表id两个信息
            i2= staffExminationMapper.addStaffExmination(new StaffExmination(task.getUserId(),task.getId()));
        }
        return i2;
    }

    //查询自己待完成的任务
    @Override
    public PageBean<Task> getMyCompletingTask(Task task, int index, int size) {
        //利用mybatis分页插件来进行分页数据库
        PageHelper.startPage(index, size);
        List<Task> taskList = taskMapper.getMyCompletingTask(task);
        Page<Task> page = (Page<Task>) taskList;
        PageBean<Task> taskPageBean = new PageBean<>(page.getTotal(),
                page.getPageSize(), page.getPageNum(), page.getPages(), page.getResult());
        return taskPageBean;
    }

    //根据申请记录id和领取任务后的tsid，即t_staff_exmination表中的id，查询客户贷款信息
    @Override
    public Task getDistributionTask(Task task) {
        Task task2=taskMapper.getDistributionTask(task);
        return task2;
    }

    //同意或者不同意放款
    @Transactional //事务处理
    @Override
    public int loan(Task task, Integer status) {
        //======================修改t_task表中的信息==================================================
        //根据id修改t_task表中领取任务后的状态status为10
        int i=taskMapper.updateTaskStatus(task);
        //======================修改t_task表中的信息完成！！！！！！！！！==============================
        int i1=0;
        int i2=0;
        if (status==1){//同意放款
            log.info("同意放款");
//            int borrowInfoId = loanMoney(task, status);
            //========================================t_staff_exmination表中的信息==================================
            //根据tsid，即t_staff_exmination表中的id，更新工作人员审核表t_staff_exmination中的approval_comments的值为同意放款
            StaffExmination staffExmination=new StaffExmination(task.getTsid(),"同意放款");
            log.info("正在修改t_staff_exmination中的信息");
            i1 = staffExminationMapper.updateStaffExmination(staffExmination);
            log.info("修改t_staff_exmination中的信息成功！！！");
            //========================================t_staff_exmination表中的信息完成！！！！！！！！===================

            //获取借款人信息表中的id
            Integer borrowerInfoId = task.getBorrowerInfoId();
            //根据borrowerInfoId从借款记录表t_borrower_info中获取用户申请贷款信息
            BorrowerInfo berinfo=borrowerInfoMapper.getBorrowerInfoBy(borrowerInfoId);
            log.info("用户申请贷款信息为："+berinfo);

            //计算利息
            Double interest = getInterest(berinfo.getNum(), 0.046, berinfo.getAmount());
            BorrowInfo info=new BorrowInfo();
            info.setAmount(berinfo.getAmount());//借款金额
            info.setBorrowerInfoId(berinfo.getId());//借款人信息表id
            info.setUserId(berinfo.getUserId());//借款用户id
            info.setInterest(interest);//利息
            info.setPrincipalAndInterest(berinfo.getAmount()+interest);//本息
            info.setPeriod(berinfo.getNum());//借款期限
            info.setRepaymentStatus(1);//还款状态，1未还清
            info.setStatus(2);//审核通过
            //=====================================//修改表t_borrow_info中添加贷款用户信息=========================
            //向借款信息表t_borrow_info中添加贷款用户信息
            int j=borrowInfoMapper.insertBorrowInfo(info);
            //=====================================//修改表t_borrow_info中添加贷款用户信息完成！！！！！！！===================

            //修改t_borrower_info表中的放款状态loanStatus为1，表示已放款
            BorrowerInfo borrowerInfo=new BorrowerInfo();
            borrowerInfo.setId(borrowerInfoId);
            borrowerInfo.setLoanStatus(1);
            //=====================================修改t_borrower_info中的信息====================================
            log.info("正在修改t_borrower_info中的信息");
            i2 = borrowerInfoMapper.updateBorrowerInfo(borrowerInfo);
            log.info("修改t_borrower_info中的信息成功！！！");
            //=====================================修改t_borrower_info中的信息完成！！！！！！！！！！！=======================
            //根据borrower_info_id获取借款信息表t_borrow_info中的id
            BorrowInfo bInfo = borrowInfoMapper.getBorrowerInfoById(borrowerInfoId);
            //生成对应的账单
            log.info("借款信息表t_borrow_info中的id="+bInfo.getId());

            //=====================================修改t_bill_form中的信息================================
            log.info("正在生成贷款用户的账单");
            BillForm billForm=new BillForm();
            billForm.setUserId(bInfo.getUserId());//借款用户id
            billForm.setBorrowInfoId(bInfo.getId());//t_borrow_info中的id
            billForm.setCapital(bInfo.getAmount()/bInfo.getPeriod());//本金
            billForm.setInterest(bInfo.getInterest()/bInfo.getPeriod());//利息
            billForm.setPrincipalAndInterest((bInfo.getAmount()/bInfo.getPeriod())+(bInfo.getInterest()/bInfo.getPeriod()));//本息
            billForm.setStatus(0);//未还款
            //设置日期格式
            Date date=new Date();
            SimpleDateFormat temp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String date2=temp.format(date);
//            billForm.setStartTime();
            //设置日期格式并生成账单，传入BillForm、期数
            int i3 = generateBill(billForm, berinfo.getNum());

            //传入id
//            Result result = generateBill.getInterest(borrowInfoId);
            log.info("生成贷款用户的账单成功！！！");
            //=====================================修改t_bill_form中的信息完成！！！！！！！！！！！！=====================

            if (i1>0&&i2>0&&i3>0){
                log.info("同意放款成功！！！");
                return 1;
            }

        }else {//不同意放款
            //根据tsid，即t_staff_exmination表中的id，更新工作人员审核表t_staff_exmination中的approval_comments的值为同意放款
            StaffExmination staffExmination=new StaffExmination(task.getTsid(),"不同意放款");
            i1 = staffExminationMapper.updateStaffExmination(staffExmination);
            //修改借款人信息表中的放款状态loanStatus为0，表示未发放
            BorrowerInfo borrowerInfo=new BorrowerInfo();
            borrowerInfo.setId(task.getTsid());
            borrowerInfo.setLoanStatus(0);
            i2 = borrowerInfoMapper.updateBorrowerInfo(borrowerInfo);
            //未放款，不生成账单
            if (i1>0&&i2>0){
                log.info("不同意放款！！！");
                return 1;
            }
        }

        return 0;
    }

    //查询自己已完成的任务
    @Override
    public PageBean<Task> getMyCompletedTask(Task task, int index, int size) {
        //利用mybatis分页插件来进行分页数据库
        PageHelper.startPage(index, size);
        List<Task> taskList = taskMapper.getMyCompletedTask(task);
        Page<Task> page = (Page<Task>) taskList;
        PageBean<Task> taskPageBean = new PageBean<>(page.getTotal(),
                page.getPageSize(), page.getPageNum(), page.getPages(), page.getResult());
        return taskPageBean;
    }

    //计算利息的方法
    public Double getInterest(Integer period,Double borrowYearRate,Double amount){
        double pow = Math.pow((1 + borrowYearRate / 12), period);
        log.info("=====" + pow + "------------------");
        double principalAndInterest = amount * borrowYearRate / 12 * pow / (pow - 1);//本加息
        Double capital = amount / period;//每月本金
        Double interest = principalAndInterest - capital;//每月利息
        return interest*12.00;
    }

    //生成账单
    public int generateBill(BillForm billForm,Integer num){
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        Date date=new Date();
        SimpleDateFormat dateYear=new SimpleDateFormat("yyyy");//年份
        String formatYear = dateYear.format(date);
        SimpleDateFormat dateMonth=new SimpleDateFormat("MM");//月份
        String formatMonth = dateMonth.format(date);
        Integer monthInt=Integer.parseInt(formatMonth);
        SimpleDateFormat dateDay=new SimpleDateFormat("dd hh:mm:ss");//日
        String formatDay = dateDay.format(date);

        int j=0;//
        for (int i=0;i<num;i++){
            String month = monthInt.toString();

            String startFormat = "";
            String endFormat="";
            try {
                if (monthInt < 10) {//月份小于10
                    startFormat = formatYear + "-0" + month + "-" + formatDay;//完成日期格式

                    if((monthInt+1)>=10){
                        endFormat = formatYear + "-" + (monthInt+1) + "-" + formatDay;//完成日期格式
                        /*System.out.println("开始日期："+startFormat+"==========结束日期：" + endFormat);*/
                        Date startDate = simpleDateFormat.parse(startFormat);//开始日期转化为Date类型
                        Date endDate = simpleDateFormat.parse(endFormat);//结束日期转化为Date类型
                        //加入数据到t_bill_form
                        billForm.setBillFormId(i+1);//账单id
                        billForm.setWhichIssue(i+1);//第几期
                        billForm.setStartTime(startDate);//开始还款时间
                        billForm.setEndTime(endDate);//到期还款时间
                        j=tbillFormMapper.insertbill(billForm);
                    }else {
                        endFormat = formatYear + "-0" + (monthInt+1) + "-" + formatDay;//完成日期格式
                        /*System.out.println("开始日期："+startFormat+"==========结束日期：" + endFormat);*/
                        Date startDate = simpleDateFormat.parse(startFormat);//开始日期转化为Date类型
                        Date endDate = simpleDateFormat.parse(endFormat);//结束日期转化为Date类型
                        //加入数据到t_bill_form
                        billForm.setBillFormId(i+1);//账单id
                        billForm.setWhichIssue(i+1);//第几期
                        billForm.setStartTime(startDate);//开始还款时间
                        billForm.setEndTime(endDate);//到期还款时间
                        j=tbillFormMapper.insertbill(billForm);
                    }
                }
                if (monthInt >= 10 && monthInt <= 12) {
                    startFormat = formatYear + "-" + month + "-" + formatDay;//完成日期格式
                    Date parse = simpleDateFormat.parse(startFormat);
                    if ((monthInt+1)>12){
                        endFormat = formatYear + "-01" + "-" + formatDay;//完成日期格式
                        /*System.out.println("开始日期："+startFormat+"==========结束日期：" + endFormat);*/
                        Date startDate = simpleDateFormat.parse(startFormat);//开始日期转化为Date类型
                        Date endDate = simpleDateFormat.parse(endFormat);//结束日期转化为Date类型
                        //加入数据到t_bill_form
                        billForm.setBillFormId(i+1);//账单id
                        billForm.setWhichIssue(i+1);//第几期
                        billForm.setStartTime(startDate);//开始还款时间
                        billForm.setEndTime(endDate);//到期还款时间
                        j=tbillFormMapper.insertbill(billForm);
                    }else {
                        endFormat = formatYear + "-"+ (monthInt+1) + "-" + formatDay;//完成日期格式
                        /*System.out.println("开始日期："+startFormat+"==========结束日期：" + endFormat);*/
                        Date startDate = simpleDateFormat.parse(startFormat);//开始日期转化为Date类型
                        Date endDate = simpleDateFormat.parse(endFormat);//结束日期转化为Date类型
                        //加入数据到t_bill_form
                        billForm.setBillFormId(i+1);//账单id
                        billForm.setWhichIssue(i+1);//第几期
                        billForm.setStartTime(startDate);//开始还款时间
                        billForm.setEndTime(endDate);//到期还款时间
                        j=tbillFormMapper.insertbill(billForm);
                    }
                }
                if (monthInt >= 12) {//大于12
                    monthInt = 1;//设置从1月份开始
                } else {
                    monthInt = monthInt + 1;
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        return j;
    }
}
